package com.wanjl.spring_05_mybatis_spring.common.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

/**
 * @author WanJl
 * @version 1.0
 * @title MybatisConfig
 * @description
 * @create 2024/11/1
 */
public class MybatisConfig {
    /*
        之前需要加载核心配置文件，创建SqlSessionFactory对象
        现在不需要了，我们用的SqlSessionFactory对象、SqlSession对象、Mapper代理对象统统交给spring管理，IOC容器
        我们只需要将这些对象bean实例注入到IOC容器就可以了

        为了让我们方便注入SqlSessionFactory对象、SqlSession对象、Mapper代理对象的bean
        mybatis提供了一个SqlSessionFactoryBean对象，用它可以注入IOC容器
     */

    /**
     * 该方法是加载mybatis连接数据库需要的数据源信息，对应的是mybatis核心配置文件中的 <environments>标签
     * @param dataSource 这个数据源对象是我们在JdbcConfig类中加载的数据
     * @return
     */
    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //我们还可以为所有的实体类取别名
        sqlSessionFactoryBean.setTypeAliasesPackage("com.wanjl.spring_05_mybatis_spring.entity");

        //加载数据源对象，对象里封装了连接mysql数据库需要的各类参数。
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }

    /*
        MapperScannerConfigurer：作用是扫描所有的mapper接口并且将接口对象注入的IOC容器中。
            1、扫描指定的包路径下所有的mapper接口
            2、把扫描大的mapper接口生成代理对象，并且注入到IOC容器中，方便后续使用
        对应的是mybatis核心配置文件中的<mappers>标签
     */
    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer() {
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        //指定要扫描哪个包下的所有mapper
        msc.setBasePackage("com.wanjl.spring_05_mybatis_spring.mapper");
        return msc;
    }
}
